package es.duma.util.xsl;

import es.duma.util.config.Configurator;
import es.duma.util.log.Log;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import java.net.MalformedURLException;
import java.net.URL;

import javax.xml.transform.Source;
import javax.xml.transform.URIResolver;
import javax.xml.transform.stream.StreamSource;

/**
 * Implementa la clase javax.xml.transform.URIResolver del api java Trax de JAXP
 * Resuelve la procedencia de las posibles plantillas incluidas dentro de otras con la clausula xsl:include
 */
public class XSLuriResolver implements URIResolver{
    
    /**
     * Path de la plantilla que invoca el UriResolver (es la plantilla que incluye a la otra)
     */
    private String pathParentXSL;
   
    /**
     * Constructor de la clase
     * @param pathParentXSL parametro que contiene el path de la plantilla que contiene a las otras
     */
    public XSLuriResolver(String pathParentXSL) {
        this.pathParentXSL=pathParentXSL;
    }
     
    /**
     * Obtiene el Source de la plantilla incluida como path relativo a la plantilla desde la que se incluye
     * @param href parametro name del elemento xsl:include
     * @param base
     * @return
     */
    public Source resolve(String href, String base) {
        Source xslSource = null;
        String xslPath=null;
        URL xslUrl=null;
        
        if (href!=null){
            Log.debug(this,"Se invoca al URIResolver. href:"+href+"  base:"+base);
            InputStream in=null;
            // La ruta es relativa al xsl parent
            xslPath=pathParentXSL+href;

            try {
                xslUrl = new URL(xslPath);
                //Obtener xsl source de la plantilla incluida
                Log.debug(this,"Se busca la plantilla en el path "+xslPath);
                in = xslUrl.openStream();
                Log.debug(this,"La plantilla se ha incluido correctamente");
            } catch (MalformedURLException e) {
                Log.error(this,"Error al formar la URL "+e);
            } catch (IOException e) {
                Log.error(this,"Error al obtner el inputStrema del xsl "+e);
            }
            xslSource = new StreamSource(in);
            return xslSource;
        }
        return null;
    }
}
